use cometbft_types::types::{signed_header::SignedHeader, validator_set::ValidatorSet};
use unionlabs::ibc::core::client::height::Height;

#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(
    feature = "serde",
    derive(serde::Serialize, serde::Deserialize),
    serde(deny_unknown_fields)
)]
#[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))]
pub struct Header {
    pub signed_header: SignedHeader,
    pub validator_set: ValidatorSet,
    pub trusted_height: Height,
    pub trusted_validators: ValidatorSet,
}

#[cfg(feature = "proto")]
pub mod proto {
    use cometbft_types::types::{signed_header, validator_set};
    use unionlabs::{errors::MissingField, impl_proto_via_try_from_into, required};

    use crate::Header;

    impl_proto_via_try_from_into!(Header => protos::ibc::lightclients::tendermint::v1::Header);

    impl From<Header> for protos::ibc::lightclients::tendermint::v1::Header {
        fn from(value: Header) -> Self {
            Self {
                signed_header: Some(value.signed_header.into()),
                validator_set: Some(value.validator_set.into()),
                trusted_height: Some(value.trusted_height.into()),
                trusted_validators: Some(value.trusted_validators.into()),
            }
        }
    }

    #[derive(Debug, PartialEq, Clone, thiserror::Error)]
    pub enum Error {
        #[error(transparent)]
        MissingField(#[from] MissingField),
        #[error("invalid signed header")]
        SignedHeader(#[from] signed_header::proto::Error),
        #[error("invalid validator set")]
        ValidatorSet(#[source] validator_set::proto::Error),
        #[error("invalid trusted validators")]
        TrustedValidators(#[source] validator_set::proto::Error),
    }

    impl TryFrom<protos::ibc::lightclients::tendermint::v1::Header> for Header {
        type Error = Error;

        fn try_from(
            value: protos::ibc::lightclients::tendermint::v1::Header,
        ) -> Result<Self, Self::Error> {
            Ok(Self {
                signed_header: required!(value.signed_header)?.try_into()?,
                validator_set: required!(value.validator_set)?
                    .try_into()
                    .map_err(Error::ValidatorSet)?,
                trusted_height: required!(value.trusted_height)?.into(),
                trusted_validators: required!(value.trusted_validators)?
                    .try_into()
                    .map_err(Error::TrustedValidators)?,
            })
        }
    }
}

#[cfg(test)]
mod tests {
    use cometbft_types::{
        crypto::public_key::PublicKey,
        types::{
            block_id::BlockId, commit::Commit, commit_sig::CommitSig,
            part_set_header::PartSetHeader, validator::Validator,
        },
        version::consensus::Consensus,
    };
    use hex_literal::hex;
    use unionlabs::{
        encoding::{Bincode, DecodeAs, Json, Proto},
        google::protobuf::timestamp::Timestamp,
        primitives::{H160, H256},
        test_utils::assert_codec_iso,
    };

    use super::*;

    fn mk_header() -> Header {
        Header {
            signed_header: SignedHeader {
                header: cometbft_types::types::header::Header {
                    version: Consensus {
                        block: 123,
                        app: 456,
                    },
                    chain_id: "oogabooga".to_owned(),
                    height: 321.try_into().unwrap(),
                    time: Timestamp {
                        seconds: 654.try_into().unwrap(),
                        nanos: 321.try_into().unwrap(),
                    },
                    last_block_id: BlockId {
                        hash: Some(H256::new([0xAA; 32])),
                        part_set_header: PartSetHeader {
                            total: 1,
                            hash: Some(H256::new([0xAA; 32])),
                        },
                    },
                    last_commit_hash: H256::new([0xAA; 32]),
                    data_hash: H256::new([0xAA; 32]),
                    validators_hash: H256::new([0xAA; 32]),
                    next_validators_hash: H256::new([0xAA; 32]),
                    consensus_hash: H256::new([0xAA; 32]),
                    app_hash: H256::new([0xAA; 32]),
                    last_results_hash: H256::new([0xAA; 32]),
                    evidence_hash: H256::new([0xAA; 32]),
                    proposer_address: H160::new([0xAA; 20]),
                },
                commit: Commit {
                    height: 321.try_into().unwrap(),
                    round: 321.try_into().unwrap(),
                    block_id: BlockId {
                        hash: Some(H256::new([0xAA; 32])),
                        part_set_header: PartSetHeader {
                            total: 1,
                            hash: Some(H256::new([0xAA; 32])),
                        },
                    },
                    signatures: [
                        CommitSig::Absent,
                        CommitSig::Commit {
                            validator_address: H160::new([0xAA; 20]),
                            timestamp: Timestamp {
                                seconds: 102030.try_into().unwrap(),
                                nanos: 405060.try_into().unwrap(),
                            },
                            signature: [1, 2, 3].into(),
                        },
                        CommitSig::Nil {
                            validator_address: H160::new([0xAA; 20]),
                            timestamp: Timestamp {
                                seconds: 102030.try_into().unwrap(),
                                nanos: 405060.try_into().unwrap(),
                            },
                            signature: [1, 2, 3].into(),
                        },
                    ]
                    .to_vec(),
                },
            },
            validator_set: ValidatorSet {
                validators: [
                    Validator {
                        address: H160::new([0xAA; 20]),
                        pub_key: PublicKey::Ed25519([1, 2, 3].into()),
                        voting_power: 1.try_into().unwrap(),
                        proposer_priority: -1,
                    },
                    Validator {
                        address: H160::new([0xAA; 20]),
                        pub_key: PublicKey::Secp256k1([1, 2, 3].into()),
                        voting_power: 1.try_into().unwrap(),
                        proposer_priority: -1,
                    },
                ]
                .to_vec(),
                proposer: Validator {
                    address: H160::new([0xAA; 20]),
                    pub_key: PublicKey::Ed25519([1, 2, 3].into()),
                    voting_power: 1.try_into().unwrap(),
                    proposer_priority: -1,
                },
                total_voting_power: 123456789,
            },
            trusted_height: Height::new_with_revision(69, 420),
            trusted_validators: ValidatorSet {
                validators: [
                    Validator {
                        address: H160::new([0xAA; 20]),
                        pub_key: PublicKey::Bls12_381([1, 2, 3].into()),
                        voting_power: 1.try_into().unwrap(),
                        proposer_priority: -1,
                    },
                    Validator {
                        address: H160::new([0xAA; 20]),
                        pub_key: PublicKey::Bn254([1, 2, 3].into()),
                        voting_power: 1.try_into().unwrap(),
                        proposer_priority: -1,
                    },
                ]
                .to_vec(),
                proposer: Validator {
                    address: H160::new([0xAA; 20]),
                    pub_key: PublicKey::Ed25519([1, 2, 3].into()),
                    voting_power: 1.try_into().unwrap(),
                    proposer_priority: -1,
                },
                total_voting_power: 123456789,
            },
        }
    }

    #[test]
    fn bincode_iso() {
        assert_codec_iso::<_, Bincode>(&mk_header());
    }

    #[test]
    fn json_iso() {
        assert_codec_iso::<_, Json>(&mk_header());
    }

    #[test]
    fn proto_iso() {
        let mut header = mk_header();

        // bls12_381 and bn254 aren't supported by the old tendermint types, which the proto encoding uses
        header.trusted_validators.validators = vec![];

        assert_codec_iso::<_, Proto>(&header);
    }

    #[test]
    fn bincode_decode() {
        let bz = hex!(
            "0b000000000000000000000000000000050000000000000062626e2d31dee1000000000000cd92fd6700000000fadca22201e4a56017947f084f060541877fb61ef3b80314695c4ae3256efb49ed251f562e0100000001aba78231ab06e91264495a0d50c4e058dc47aa091269c1d8a4dea9bc9caacd113c350c75525288bad1d53af34ff0c7aa80fda220c0e48fc3dbed9c788b4ac36ff23806a84fc414de3559755313024ed9bcbcbf840ccd090b86845c1dd2f1d4baaafbd9b8eff8c8b0414d0fb8ec282dea6d2f20ec0a00718cfc6355e0a3b34839aafbd9b8eff8c8b0414d0fb8ec282dea6d2f20ec0a00718cfc6355e0a3b3483922e3fa2d1695ae7db62e55677bf0c914b1ec88d64cd8d280cf2e29b2e06d0965a44d6b3b757a871048312142acf5acd3f8f7bb0b124e934070a73220c895f7e40790fcb874201a8c4a32b94d6d54699676121913822e577433e33133b13bacf4e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b85564cdacb04fb9c3b290579644f9edbd05cb00bb7ddee100000000000001000000012f21db36c8cdacaef30683e5d7f2a059863369cc97253c828c31b45e12ee811f0100000001b9f6672f8031ea0d134a70a58f218211354cc93b0c1efcba518964b9f8ed03466000000000000000010000003c70d8336dee739bdf2d1c5a0fca0a88b87b9a6ddc92fd67000000007e64ff0a4000000000000000d1668fcf19649f12bce0c7166690e7e44b9e92b4d5aa5d77f0604f419d7b6ce7ae1c090816bd516c6963b0ee3021fd011de44481c843252c20b773ca2da24b0d0100000033ecd5899a91105bb4e51066eb138189bc3825addc92fd6700000000c000c30d4000000000000000594f40799b5c3f936124787572e412ecc9a851aee2445dd32e193340d62191f9b9ff572adf511785a0cff5207304ce47c22fdde2f670077b08552f3bb238f40a01000000f2e6bb25d8d269c9737bd3789b11dc76c4fc56e7dc92fd670000000019da9f0c4000000000000000fb30e94789b65fbde4a378793127a4657ae94bf383d9662c73d14da9549a452839f6674cf56011a3d88526c9da44695d33b510f94376becc7df94830d7a9eb0c01000000c27b627c2fd11ee1e3e850738720692be2e3f4c6dc92fd67000000002e107e0d4000000000000000894ac5cc29be216e9a3efe749703aa7c5becb4820d9503230b4a3cee041a7076b7060ef677f9916d22add307d3362d3a999c4c42bf57b2be02a436ca8591850101000000bb386aa0e7b37eb33516aebb58cae3574af85d1fdc92fd6700000000a611260e4000000000000000b87ec5cd663cc39ef6bea0ce7669b1f6648990dc87d61b7c74f9fc86a5821072ea76bc9d0b4ed68ed5d4113ffe8c00f41f4c90828368f475cc499c7b53cfe10f010000002a3d40c3e7ce8d6b55077335cab141c2e11ac254dc92fd67000000004553a40e400000000000000034bb471fd1362581d457c3188c0f7a7aaa029152b583d064a0db52b95385ca2960019fced10449d392dcf4f97c2a032cf43a0457e0b3a5b3f85cf6757f08dd000100000044c395a4a96c6d1a450ed33b5a8ddb359cefed36dc92fd67000000000830c10c40000000000000004019773a4b9ecd79031613acf7c1b56a04c235b79ddae3963538d4c510ccd57e81e09215252afce658a25d2fa3b47b777ea7b8d131d0d0f0686f3a19877aad0e0100000043804074334ac6111233037efe20105c516b0e9fdc92fd6700000000b04b390f4000000000000000665f3705d7e1840419e6d5b18e7dd44bfdaa85c570c1f8cd5abd3779f01da82a54315e8d93cfd34900802fd250314cd4f0b44b1d89d17f9aad8fa144f5de540e01000000ec033669fe506006f870bd8b12cb524a3abc3693dc92fd6700000000df22ac0c4000000000000000749f94ddf804480d70ceb42414053c3c20a810818619e6474f600b2ff8a7c5d2190847358686821550b1640346be911f958a470068c3a5c5f2ff97b6c4d75b0c0100000064cdacb04fb9c3b290579644f9edbd05cb00bb7ddc92fd6700000000c6ad660d40000000000000006dbb355bdced47869131705beaff0ef47dcfcd9e7e9cbb63a0aa0ad27f984dbc9476fdb10a3e7976c4d6ff6c90aada830fe37a8ef08247acf49f2383c0355a0a010000005295664886565f43a3074140551a755872bf6ffddc92fd67000000003f37c70d40000000000000008a2c771f2c01e31cd9d4938b065be94ddca10aebb5e1e2a7abf3f0a0974a01230d0144aa74ddbed4d3a53003ad7e9fe322ecf58b2a88cdd4d91183c915b9db0a01000000da37d2935eae0a92de55e86db2e887b4f18575f0dc92fd6700000000ab08b80d40000000000000007fad7bf5c560d374f8fce2bf11c748b5b67cf98f846ba61597fd131a52f4c21319075148028cf75c94e2730f5e3ffe4f15049925b75e2a37af129645a10d740001000000718160e3538e0b0ed83d3b3dc4ece83809fcd107dc92fd670000000067551f0c40000000000000002472f91b19fd6b5f9b8c536feb9a2c1dc79d131b0eca72ff47729fd7f04df245df89d50698c0323be26aab2da1fb88eedc5610a365ff67b3122a2bafe72ce10e01000000b03f0cb997f3428ef3968833bca2f2a4f613a8ebdc92fd6700000000cb3b750d4000000000000000e71fbe386dade1a2e05e4e835ebe9f8ae17276ae6738dd311a205584522fffb86e9e5555b88127895d130f6059b0475c287e4d3c530b3a36016885d150511108010000005c78a0762f13b0b2a793e82d1a178eb45642234ddc92fd67000000008477d10a4000000000000000aae679b6a0ec424ecf4ef251b8a846dc45bfad6786af6555c951552e8586c9c544eab0863a68b1d10500b1bc0835ed629cf8b4032b298c9f09240b652298ec0c01000000410c1ebaf54c090f0a9132dfa9f79e0f480b2c06dc92fd67000000000b54cf0d40000000000000002bad746822972e4e45ad4b15b87891808586a0616d5a7f11875e504abccda8a0a56f5d8b11c273a41726f0180c534092d3f994372d7a9e39c60fbff83960460a010000006cc0a1531ff58d61dc9061c5b89bc0efc07911fcdc92fd670000000093e2f20a4000000000000000f4d22e704c77cc278f1f00f2044b1af01e3e65dc948b86dcf83faa85f6a8d1912a542b02f22ec7ae85a48ffe9aed2da3d89066029114cc80cf0161569f4428020100000053406de83381dd804632447f1baed00cf28048e0dc92fd67000000007b12e70840000000000000008f0cc1ec4a79ca248e4c3a6a064eb06927054db38e2622a88299f9e83f8b929925c35f976db4cf5b94bfe90b29292fc3d4b3cb192bccb75c215430543c1b70010100000070dac78498afc6d766d860c433265a274d48b7d8dc92fd67000000007eef580d4000000000000000dec9bdf51feeb1c38a88e2f49c6ec4284d978bf1fca45d592b588a253bb7097341406ada4b886462164e3df45116901bacedad58fc61c1407e92a1430099f80e01000000b41ef50272a7a2398ba617d3c963986ebebc5b2ddc92fd67000000006da761134000000000000000bb3f1849d7cad3b10daf14edbc74705448ab7e4117d4a723655f6df2f3bd06aa06efb20439a5802bf5e0ef157123c379a78b8d63a2e9f1ebc9c8941d502b7e03010000003965c223e13ac66f8175c86e657d396c711964b7dc92fd6700000000b451da0c4000000000000000746d12153bbfab44a975abf9b240b20f0992d3454c93474a9522dbb6022487ed4d0e7cfc45ea17069cf2a42e1516afc0f903cbbc64564eae79d92765edde0c0501000000521d2a344e322b8ba76401c833a1ec74ea2bd075dc92fd670000000074a7670940000000000000000f01eabf40b227b8f6f5ed90b25202cab4047b2e5f4fa39d5aebb877c501913630c78e333a09c46dc9287ddf3cdb0071811b9e78886b1230d65d7a706727ad0301000000e2fc4df9e7870fc8238136faca07a120cc078a0cdc92fd6700000000cb93f30b40000000000000004c3aec69c4d8b5343e8834d26a07c040fd40858aa419c87ae81bb4c16f3fa2ea9e1ae00b75b3aace0b3a3e2bf2e44b60b49090c08b5f5f1b604f58d427a1a9050100000035f6c0359084c37ef6eb4061b694386910093b99dc92fd67000000007e4f97104000000000000000431834ba4e91f64a95fda1b00546c00a4f96fb5417aa1113b03377fa04159f183473a77f4f0254a35057629dbbb90b7b74faef8323c2d19b41f4f0fc19683f02010000001b03ab3c744545b281d224127708a9ec7487e58cdc92fd6700000000dd0aad0a400000000000000069343a6e4df448569bf883a488a1554bf622aaa6f75d8c19855fc1e1ab975fe07abe58e6b207329a9d5fcbf8ce29657268331f204e6fe703a8590010e5825d0f010000002a1b3fee6b29ea1828d427f0e5c3887cb7e64487dc92fd67000000003ba5440c4000000000000000d0edaa5792373569d866cf3b972df1fe10c357be7411e4333b9b8a33044140c7cb37ab006ead611d1af2182a05ea90c396c7cb4a35e3570e34bccf865c6d3b0e01000000ccb2909dcd316fc5e738dcdb1f14360f04b44320dc92fd6700000000c8709c0e40000000000000004afe18796206a73eed44fb8861ec9e0e5f87409e896f371cefdb84642234b3e4508b3f56e43fbd30b59c1696fd46d26f19c752a7c2b4fe7535c92b773dcaf90001000000671d816776e8c7fae18dc122fb6dc231956c6d48dc92fd67000000009bb0e20b4000000000000000214a0ae8edd0691c4545d594a1c6d1dfcf252f9f572758ad8510bb688c48b10bce37e5175a970f8ba0af15045e89cc264f44eae6b198ce588dcd523b428d680c01000000188f984567f5c6426386127b6fba27cb59684dc2dc92fd6700000000b401530d40000000000000007789393c0221d71adb0aa7463cb4655d8ed7700a1331ee96e817da681317c22242254f0eb687d8bad3fe41b0d009b8b9f923929bb1c8bd50915c7643c8f924030100000077be23139b650d69ede7985b31fd7b1cee9ca7d3dc92fd6700000000231c4f0f400000000000000009c8786a1c9e28bdd3bcb19e386e476fa53a868b239a3544b858a6d53462386da6ee26e0384e8b274a401540a61ac0c27a469a556419c0201860df8a7a71d504010000001a4b644c16a4a1904618f8d3c0f6a67223038390dc92fd6700000000be18691540000000000000006072da40b5a936f2c194eb3c64aa40912d36a0c6c62e01240c075b8c09827ce88fe617369cce301d55889769a0772eb53b02a44d24fe220499df394c1ff2550201000000c268fe001a533b6f0860167381384363a790fd0ddc92fd6700000000c288f20a4000000000000000490e1676c2b0ca48f48c7c9574bff4e0ce7252e55b9eabffed5f98b009fcab03225d90c614b529327c6188abd86313e9143492a03b3b303512446a3fb19bee0501000000a8a2bf2709ca05755f881ebd939991aea9f88cf1dc92fd670000000075ebcd0b4000000000000000c80df9101788eaf67999381df33169aa6b1423d1a58781c674bea01ebf8e3ff7740924c7dfb5a89990503e013f0f544c48e21257fff270c734c1751110c22a0e010000007ea986d8723587f5e653c0df785fcfce39238785dc92fd6700000000c5b21e0b40000000000000004b51d4294cba70231245444ba1a4b2e036e66c689043a39c3bb0d6c8b8e8df87c07af145b965d3293850ac63feee7b651f38505854599e15369a1dd94e1f060601000000616a45478336b92583cfe29e8ee942802de69eaedc92fd6700000000ba74b5094000000000000000aa81b2679ed38d24595c336ac33f54507c480b8e94711261ea2c0874cf6c91aa921ce20535c06721558fa8af13a929fa4b6b4020f0fd69d465f15c229fb24c04010000009407fa25941c932473f8e2b1ecc5481e3ae15a71dc92fd6700000000fd5e550d4000000000000000edb9fc8f682662e30d017aa3938751319010d965ba7a056e94b530652a5e7480d08bd5ef6bf6dc4ef382ea1fc8aaad3cf0b9e6527ff1fdc3a3cbc13f6139ec0001000000f42c7e49df4f4d0993237959518415e473792392dc92fd6700000000a7ad950b400000000000000078fbd2241ddb28f371c833d5fa6ea2df4be2d4cc955ddbba80f1635a33c68463a70544e5d4b0a3d4d310d69f6d6b27a987a473fe82d7113ca68c73fbaf2c880701000000aea26001de9b15d4dad32808712864e61ae52a17dc92fd670000000085b6d110400000000000000087cf4218c73d910f8491b08f174e48ead5d63369b714fa4bd3ba06be4c4c3f9df329e6624aab4601087d11f525a61323d692d8da5e68859cbb0c656f612ea50901000000fbc2a3f682b507f1a3a5d4c44c8cbb6af0860296dc92fd6700000000cdf0fb0c4000000000000000547b31f13b92120560df3ef667649c520559f64065c929c424d36b7f6874eed1d963cfcf4801369ef0214f9ee5b79c8db47180b2c61f2977dabf945a875f4f02010000002888677e39e38bf4ee64081bd43776fb4d507fcbdc92fd67000000005384860e4000000000000000ded22fa7e99447050b8da73a93860abff3284631e3425eb9b0710aea10e63635d86f723e55fc2b71da98e84529f7ab03bcefa2dcc3d96c9a15ccb26672947c0b0100000023df4a8418762cea4d24b7227ad125df76d2baf6dc92fd6700000000fc6cfd0c40000000000000001411a2aad941dc0f05cb305ee34a2bfcbd0f38c2f9f76ee2370150e8fc96b8bcc197d807b9e43bbdd624d079253727902f3722d283d3f8f8cb7de9c0df3fc20801000000a9c7a884bd7d6e799ef5311bf9168e0105bce416dc92fd6700000000a2c3390c4000000000000000131549da690839c7de7967d243de63d2c7441fc624096e9f1d11d83f3ca6c1cbc9fdcc377baa7efb849f568ffa1d1db85cba241eb1845ef34e3c18b8d476ad0c01000000b8f9204a348e0dbc85abe5bc98936d6b84c01e45dc92fd6700000000db34740a4000000000000000ad607e34654f2565a287759039c747c43034f4bad4239c8a0d2c3bbd7e270a60e2c4cb7cb590222359424bb1a72b9aebdd63e3e480eabba0ca129039767f62040100000076f6dd3f07bf2e9ff5b0a188bc08d5a4efcf40d9dc92fd67000000009930670c4000000000000000d4bba468e2f5b23fc126f5c8f987bdb96864b24b1805191287963ae3a3f9903f6a1cd868aef4462d3c71e301c9291512528a5c11c4e918082309f90e368aba0f010000009fee83fbf0bd5a4d71519efc16d0d438c203dd5adc92fd6700000000dcf1600c400000000000000069be4874085ff6d86c50671d258708828752b542de8a69289aadc48ff14e67accfc7eb27a35010a33e3ab16acb6b6474060340b80ba8ee5347ec145464f7cb0c01000000b44fc7d70708095fbc30af164410749483f96439dc92fd6700000000642217164000000000000000eb6e9e073e3181a81ccd61afb28691d6dd666618c9e35fe02583ac21d665e4c9207e1d18b7dec2d305af15ece02ceec10d7558b6a9511a91b605322b8d382909010000002ab301f354a74f45afb347b2c00cdceb09cc719ddc92fd6700000000fc1fbd0b40000000000000003ff30654885e849e7e005ae7e78512a1c258e9ecf8e4a65d37e504ce8f1746f079453ba13314d401eada93518c01ac6743a46d0f1b837430c5ba15da2d54880f01000000dc0802ad3262ecd784ce339d87073c836e31c69edc92fd67000000009641ff0b400000000000000062b3c5950f22390eeff47f991ad0f37d89d2bf379784564a0f8879a3cf4aedee66662da7621e3e3e42acdee0e55a9cdabc6aaad4ea9cef619274520b4c7f01070100000060c51d643048d0a426171bd0deabd1689a89690fdc92fd6700000000e527ab0d40000000000000009f726da9ba9d2bfc10191b29047ade65f8b097aec2eb289a829593a60b4b3d455fe1f89d863c54e7c0113022592e156dc002d1340e449ac70f7b5fcb87e1340b010000002972b0df619f73d1a5c8933aff22ad8c9258f370dc92fd67000000009e33540d4000000000000000ffd4fe59419da0d2625eb81a6e9ffcd6b00f048bdabc0b752cb7e7f679acdc6c934099d55b7de434159db9f1e1049619aa08d1185d3b86e3a283559fd6a8d20c0100000006be03f1b334fc3f7947d0d031f7dfa568005bd4dc92fd67000000005788cb0c40000000000000006150ff91f3bb3944eef77da62cca0ae975acb24e969a08e7c5c61552d3fdd218ae5454eeac3067dd06df5504fb74faa16731b741ae22fb66ea603f82fbc14709010000009c4cc8543dc684948490681118957942b29a9200dc92fd67000000006a89c00b4000000000000000a36c0134791a9e2fdadb9ca6c63562257b181e8c326d482f87320cffc1ede9b2aec01d7415fc849aed0734703406f13a6bf821a9c1e505f72872ac838b46740701000000466d1236b8c77925b25219e4ffe34dd069351847dc92fd6700000000be86910c4000000000000000385c823bb0e6a3bb70c71cd8440efd4c735a08f0fb38f34c23217c47b613915ca3d2ca201a5e7ccaafe385a8ea2c1af43e7e00a888281f1550641199f41c800301000000646d5c6384c84c2e660bf268d0a4ebc1ffbceea6dc92fd67000000007b0e4e11400000000000000089e23aeb49e5b923ec5d9a7646557f03059244cd49254dd3df50d901977c40de74b6a06664eee8d8127eac54780c589e420ba287cc7521d89dcc4f990a53d0060100000002d49d26c87ed7dc1e38d7bfe5b7fcdf5a3a3164dc92fd6700000000f9d4ca0f400000000000000006e01177048f97970117e07101408606a15c2ac8cae12c04f9aff1163f281c14ea8fc45116c7e3a60c8946f56b5c8f1df7da25ee766c699ca3dc32e74f72d703010000003ce85b466ff74142307b4b03ddacf17a52d46373dc92fd67000000000018d70b4000000000000000ef47867defcda5d3b62a4d9dfaf5f8e8c9417438512bfd733b950379aecd4732130e57cf4e86dafd6685cbaacc40968079da6aa8f63318a616ebf778f351c30101000000f1961eee75e5a1c8a11a5bf72fb368b990bdd289dc92fd67000000003c8c4c144000000000000000df26ec2da0ea052e27ad554c361b12b223f617120f4088ed29c3ebf0994e5e9f2638da74726fa38ff77dfae6f1a8c990d1e5ef537c9309e33668109107ebcc02010000005d673308ca2b45e5222303836d833e0f70b1f9b0dc92fd6700000000e0fcaf0d40000000000000006b9e7ef2541f5ecd60c2467786c2023ba50becadf1ae761d694c5e5bb326f9c3594e20789a5e7266679f12fb7310b2a9994fd4c7e7f02b06123c6b9f35cc900f01000000913834357f92e577cdc02b1e682c65e86d016ae5dc92fd6700000000ccb0c7094000000000000000bc6f207707ed98c0f5bf3128b748c9edab7e552307af615e65d86d555f299368078b09d2766161597b1682ca6f4000df3c65cbcf1ad74c93622161c342decb0601000000a8f38fcb39b580c4b856dcaed882d504a216ee00dc92fd6700000000f0ddb70b4000000000000000e84b9857e636ab6bdcac66db0396f40ada1ad55764828890c0f4e0ddf405d8834b2726106dd12c1741ef1e9dd043097354b6e3b553fafc39431515aeea87620c01000000c4ef42d72d69f4b58ffe2a58db1335269842ac43dc92fd6700000000bc2dd811400000000000000074716ce6cbee28f1e81c4347310a547e4175119f37a23843f9141219c40fdaf054b76bfc73348632d2c761146f442b0ae6773fea124dfd2aaa95d6bb07940e0101000000d7076d16c2e91e0eb16753575ac3cee3057781c0dc92fd670000000089af770c400000000000000042312437e504b33dd0868de847c54400db1c06976c3ac861a89ebab1eb86b072f917efe8e516c55c580740efc176c34055f7ad310e025436ab241cd2b669660f0100000001b2c0f03ba9b2f352a39bc45ce37aa2710b5af4dc92fd67000000002e500811400000000000000091a3b8f84f2c3b4a0dac8344c74c72615efb3f9c7dd6618d880c50a01b93f0775f835aae219b6e973b212f50cc60bf82aae472f60311796adbe9742a7b64780f01000000fbe1e3ed324fa17379403acfc3dd28fa882c6e65dc92fd670000000018c5eb0c400000000000000060eca7a9dc974865c24263af46c8df64d202604a165e38985c1ee78ddebbe58a31eab48e3c25ea62f33b4499c9a4c55e4ebb1dfcb298b980064ab452bed4e9070100000043965a09c5be34d027a599bd6f450f5e6a13ddf7dc92fd6700000000748e4c0e4000000000000000927500d3a89688fe87a63a506615890c2c1f23a3161c256618303d20765c4553dc5d53f0bcf854be0130991dd9f8b60e6fd0ac41963307e8cb1f925880c52f0901000000edd5716db0738cb0eecd0a04aeb186c4a46720e9dc92fd6700000000f0ab990c40000000000000001b0d132a202cb605c50b7e28c9e2cbcdf829c6cdd0f2acf1b6e284b69f151e7dcd2c64ce5f122972af96b4944f5c276e4354523f86edfe91e8f7c4a3183e1e0401000000f8260be47a1c7d42bbd9a656bdf8e3d3f28cbab2dc92fd6700000000e310bf0a40000000000000001130e502e3042ac6d40378bc18013b2aef5a1ff500295b47f009dcf64d738234d10218114a0a6e6ab96e222ab41e3483d06ea74be7d9db30f7563f2c13387e0d01000000e6f8df77989972328c927e5493db6908936a4ea0dc92fd67000000003d39100d40000000000000009963075ba70a2e12fc28a44fbcd8269a6d7aa5c28bb04b1fee78a4ca101790ce655db8936f6415eb174ef4c3001d60f3027940b4d3a63cae96a10064a8fbd90a0100000025764380a6df1c9cad29a842a049f690ab0f08bcdc92fd67000000003262960c4000000000000000037d1c3f08a2123cd657b66d5f45fa243a10974c3e05790011e55b1f8341a143d09e2aee702da5cda655341d66abaabac2cfa2967183c6816440011e774ac0080100000051b78fd2e37a2142b313f68a4edb31b23fe1afd1dc92fd6700000000d04b6a0e4000000000000000336c627bb6a6e4ff19b07a59a2723b2888e15df4e0b7fab8bb7fa671107c8f2679215fe05d8312d23046b3bebc3626147b29b3d3ed1dfd94154abdf139d78a09010000008dabad1a71629e4938de8c44d0bd2f2ce1eabd08dc92fd67000000000212500d4000000000000000b34e86aa00a35a43abc956f33e892d0f43c84c42f16481286742171de142d8e03b55d1a2f0951f88880a3e44a759f87fa6b02a852a39fb12e6f86b7e79299102010000004e30f6a73766baa5fe6db7181b7fd08329c103e0dc92fd67000000002b3fe70c4000000000000000476d5062067a2742eb7543979abe75e3d4e73755e9dfa219e8c5390606efc3f605329b9a280800fcc4116b25c3f35af0e42486a11f217548897144d452ca12020100000066439667823cf1cdefaf47d5ada806d462a6e05fdc92fd6700000000f6cf1b0e4000000000000000cae2c478d899b4edfe2bfea4b07c7cd5000ed9e880d06d2c7819c0a5ec99597bd8d2e8696c9323d103324206815f36d69522454a30b918c8d2b7eabe10b7730101000000f70543a091a45a8c0de04e5ce9e40d9c16d980e1dc92fd67000000009965be0e4000000000000000f867b14f569c0f3e980f9b4e6380abf371299c4f5b3c4726019a8e9dc95828b75c79e6eb4ed72356b869ee5c38ef92ad3352cd3fce2bd1c7630d60ae1d60550201000000b860c8e1ad41462d6352406b85260c9713418ffadc92fd6700000000d2d4940d40000000000000002dd69cd319bf93ee6872a5b334ccd874e7cb6c69a88ecdea0d326d891f72d592a7ec3e7506370c7e08fecd7b497b0a808c2e3ef03efbb616fff6c1d3e9dd4b0e010000006967de8bfc42a68d7c5eac521dd0099cea1fe230dc92fd67000000007de8370e4000000000000000d52cc0093c6b434d47e574a9a169e6bfdb8626fa9bbb16e0c6172f82070da622a29f5e5ba46802a5040cb27566f47178f92dd1698a6e895d22fb668edfc24109010000000d1df149a8579909fedf2111513c57897118b09edc92fd6700000000239d9c0f4000000000000000b7d87f76a8a17be02cbdcb9f8340fdc69d75990f9efa8870308dadb7a76c52e85ad0e002d8169e358a132ccbfa56d7fdb9d0f7af734b78f1600c0582d245c80e0100000002c375d9b259cdbb7b8a97d71b2a0a0dbed890e0dc92fd670000000043e5da0b4000000000000000caa495e3537821e927562a8b90cf867d5469a15525f06998b86040a314566b4a1b885a398a6609d7f0f3ecce7cd67a6865d039951f6c160bd7a929ad32e23509010000005ade83d0ec62ab3eb6b023ff54c976eaf32e8655dc92fd670000000098662c0c4000000000000000d891d9c0ce85e7254bc1f54d8d99f2357d1bb760989c086eb30a9edc17f575565574eef88078e5b2c13dbea707222eef0e4a209688cb4c65b6653257f6abcc0801000000bfffeb9cee54c0e110a1761f9a646e4589ee6fc0dc92fd6700000000e7dec0094000000000000000f520f6b05e02c2c6ca1d45dd157f5b9f2be74e7667d6e34aa39bd1ae5cb9f46601ee0fd52688c0444458e231e65734fe4f35b1fc6beb30c317f2c71df351250c01000000409d07de01ea2a63c779c0246562aa278a95611edc92fd67000000007f392e0e40000000000000003481be5f776e2bb3c263e4b5e5a9ac3d06517b54bd5e34b2b90aba1366084f9821a73b5d21f59e49244758ef476fea38809c170619956e9658150016e178770501000000a93fccc20939a8a0fecc48a9737402486bc41d53dc92fd670000000053674a0e400000000000000073b26ece239baf6b56c05a4f233771301ff8041b77b3d0e269766a845d4fa32eb2331e5e67ab4c9dc79a91ac330b0b96231f833aba18bcd407514dedd2333303010000009215b6b8ec64cb9e7b461c3945e6ce00da86f8f2dc92fd6700000000a41a2d124000000000000000c42631b751a44c69b19fdd4c4a9ea49528f788f4b6394b83cf435eb3320aeeaffe453c999eb6dc5b2ce7ab93c1a1db1997797d745a4a01871b6ddc171771210601000000cea4cde95b67ff91fd25ea77c3075944764754b6dc92fd67000000002fa2420f4000000000000000090cd7dfec7f68f35c5ec4b5ec7901ebdc724f292f5f8244725dd21f9e74fbc5a29575224b95055f2d4da96a1b61010cbed84db91904388ca091f8951de40f090100000060131b8768de4f8a40aaa34a9f0d40be902807aedc92fd6700000000a25e870d4000000000000000e1494514195c9b6b0c66fe63a1cb4f6900b1352fd21bcf62ee7e758a62d71c19e9091db4a16641fd3db15fcd2cde519d9ab73ccbb2a12e14fdbf24c2dcc9360b0100000013247270303a9d66ea8ffa02614a8b5369adda53dc92fd6700000000f4037b0d4000000000000000743a6b27b7d6ee0823d31ad2333ffde8508e1f32887cf423a0d834fe0157ef089784d4e1a248097d73f55541ac52f20652733f4f541a478b4b50304a5bcc3a0d02000000349f27787689a635ffbe00e0dd66e848690a73f2dc92fd670000000014b1dd274000000000000000b650e130849fec2bbe84fd100dad6e192dd4fa556ad4423be0308bc5358cae173fe186bfc458e04284a0863ce71630e03d2d3cbe55c3503435bcb0f54e5cc00f01000000e71b23c378e4c465bfe96ad48e7f93f237e939dcdc92fd6700000000b9fc89104000000000000000fadcfde89d64078184d1d5f394ea7cef229deba4685848b0d121c76f0014ced8bdfd82984999d1c1c1cd7d513b86c48f271676fa069d8e4213e6af9de45d240601000000c2989ed51e73b742e4991cf915d6339419657ad5dc92fd6700000000c993fc0d400000000000000000cc9c46a2cf23aa55761d7007da4c11b839f412b6f9d00f7cb4631c2e3e9dd2a31ecb132389045874122d61d5e1db4111f7974f4b5b7f8d577f11c79d676a030100000080f78edcdb53aa69dea3f482472027327f1acf0edc92fd6700000000b43e1c0d4000000000000000973741882a58558fc4d58d9910bbf6123188b8d0e1a800ff75076b876008e354b2dfe66a7141bbbadf5db7a033066cedde5c183caaa4c4896ce113d40c7a31070100000069a300bbe8cba17536cdb4346c148d1dd7475c6ddc92fd670000000056e1da0b4000000000000000096c8d242e02e346a857bac8d3a7a8a77720eb55f0c176684e10c72e06ce0845c5313983057ebe634ba0b017a02844744b8784dfb4794d1b811becd99031cf07010000001b21f9bf3b9a650607cced8c0c2fbeca3211791bdc92fd67000000001670aa0e40000000000000006cf0177340ca51bff1a44175f6fa34d22a818fea0a0ab2462407098e54123649a525c1877cd60ba8990ef98f25bb108c6cd54e234858c72e1a7acbfa92183906010000002c4e108c3f09cf9b8b1515d3b26d50e332d86e3bdc92fd6700000000df8c7f0f40000000000000003049221d183eaf44e8f2e7092e389fb991d3f86ecf53c8168e10b53ca9a11543e7ea2ad702dd4b763fc8efe47372c8623d3c404b697265908ffedbf35f441f0401000000300636fc6b27a7016f3aef03c231aa63163eeb5ddc92fd6700000000132c110f4000000000000000ab4122abf322fcdd9f99b5c1aa72642d70b2d902069fc96e982be1d8a347b1449e09b165e176c363f016db5d7cfa8edcbd2e2b8660e4902a41901b2cfea04a000100000037b7e284915654acc06e394fb423dcae6a4fd94fdc92fd670000000051a44f114000000000000000d32fcba7914db53c7acfe1f5afdb22d3cfc36e06c73fa8691abd693a584df5871e3250a930a07e5b3da3af1fb83c1f312547bab9acf6639b27b08abe1f80ba040100000065c584027f5fd8349027fa5bf1d4ed3828c29058dc92fd67000000001a2e57114000000000000000380aac5d338a2161116a25013ef2d5e0a9367210211ce3c915cb279ae573f87b3cad0390d82819028e3ba3592315fb89e40cc58923fc67fdbe23d27a4d6b9d0260000000000000003c70d8336dee739bdf2d1c5a0fca0a88b87b9a6d000000002000000000000000860e2c9b980d61bf53e1d582f789c35bedf4a252c4093e9392ba7516d9d505110b1619030000000003b23becffffffff33ecd5899a91105bb4e51066eb138189bc3825ad00000000200000000000000075617111844fcc8c90a4fc121f2c37d19643667e868192690f2314bf14526ed4d60e0803000000008e58ec0100000000f2e6bb25d8d269c9737bd3789b11dc76c4fc56e70000000020000000000000000106edcb594c1e457564711c5bc0ba0182bc42131fc5a02105da76c3e624a76f74b1ff02000000003f6a50e8ffffffffc27b627c2fd11ee1e3e850738720692be2e3f4c6000000002000000000000000bee1e39ec395c97158a2dd51695f96c7e724da138ebdbf7f417c17bb3796726edc48ff02000000007a20e12700000000bb386aa0e7b37eb33516aebb58cae3574af85d1f0000000020000000000000007033e708beda4a88c330b82edb7286df02156fa71fa53152dc306298386d42ba6007fc0200000000cf9335ebffffffff2a3d40c3e7ce8d6b55077335cab141c2e11ac254000000002000000000000000914426099b4fe08deae4590a68f553bd79ebdd4303ec6c2586719d917aac6db8557afb0200000000a91ae20a0000000044c395a4a96c6d1a450ed33b5a8ddb359cefed36000000002000000000000000aba9508fec18359f9042ef73816a167d25dcc2740d1336f66bb1e7c96c8141fd5e68fb02000000009cf493290000000043804074334ac6111233037efe20105c516b0e9f000000002000000000000000e07a4ba0104afc6cdd71e063a03e195c109e332bf5e163c37a80ad67506a62fdc21bfb020000000083e0632800000000ec033669fe506006f870bd8b12cb524a3abc3693000000002000000000000000003c8c0c3b27c3ddcd7414aa5d195175e58c36789c8ad9b58a4275e09db8d099e40afb0200000000e07798020000000064cdacb04fb9c3b290579644f9edbd05cb00bb7d000000002000000000000000c9d641627d6eced574dfdcb08e243cad1c9c9d71dceb684ad74fb865a95a4156b300fb02000000003cb83d2c000000005295664886565f43a3074140551a755872bf6ffd0000000020000000000000006f7cb6f22bb847e20199220fc0903dd24eb2a9be6424f82f0d50a6727a5225c947fbfa02000000002804fce9ffffffffda37d2935eae0a92de55e86db2e887b4f18575f0000000002000000000000000c7b8b7b6b6cc2457c271bf5201f65b2fcb363350f4387438a6218ff839a4274909f3fa0200000000e3f1492100000000718160e3538e0b0ed83d3b3dc4ece83809fcd107000000002000000000000000bb1aed9ed9b0557ba3794a48f15243f4c8c6b9b176c69b589c71664f896496f9dff63401000000006347d5f4ffffffffb03f0cb997f3428ef3968833bca2f2a4f613a8eb00000000200000000000000069f12605bf4bd86e48fda138649db87461446490efadd047f77a1ff23606bf6d3fe8320100000000f8fde0f0ffffffff5c78a0762f13b0b2a793e82d1a178eb45642234d000000002000000000000000b45c85f1255127cd73f4edaadb0cd9307522b76be00d68849efd9a2bf0920a82c2c831010000000001d87ee6ffffffff410c1ebaf54c090f0a9132dfa9f79e0f480b2c060000000020000000000000006fbfe2d80362615ec2b5ad355b08c122e3799894f5a8c81c13af60909e1b057fccb731010000000036f60213000000006cc0a1531ff58d61dc9061c5b89bc0efc07911fc0000000020000000000000007eef62daf827c634f1036c88485a507519b226c7cbb79cf203e67b3628c32b7ebbb43101000000002b27d0130000000053406de83381dd804632447f1baed00cf28048e000000000200000000000000051f5b4a16dc3ba302181af9de097f591a9546b9754b2b1cb86d2d980df4ceac0cba4310100000000b87060160000000070dac78498afc6d766d860c433265a274d48b7d800000000200000000000000054393aab853ae377ef15a80742358da0a52a9ebea553734a068f444404b990346f9e31010000000026b4310300000000b41ef50272a7a2398ba617d3c963986ebebc5b2d0000000020000000000000001a9acf9916b1e429c5bc5b12f5fea61acb5fef345712f25d12806ebc4369fdc2839631010000000013096402000000003965c223e13ac66f8175c86e657d396c711964b7000000002000000000000000238dd24b92eb981a83414440555ca2b18c57dcb8be9982bb3fb4a28fafb26081ff93310100000000c11fa60a00000000521d2a344e322b8ba76401c833a1ec74ea2bd07500000000200000000000000007375d930bcce7b8cd22c03b4f15324bcc0b2d24db0e96bc201aa21b2f8b6b11454a310100000000bee5520c00000000e2fc4df9e7870fc8238136faca07a120cc078a0c000000002000000000000000d5348d0cfd3cd3172271c08714ead78550755c10cf495c0c2bce65abf1f4742f513c310100000000912836e8ffffffff35f6c0359084c37ef6eb4061b694386910093b9900000000200000000000000001ab6e5d364ec005a1b9f0c98915e4ac371ef63795bdb7193a1b2ec3a7be80d3e33631010000000081f00e2d000000001b03ab3c744545b281d224127708a9ec7487e58c00000000200000000000000062180dafc3a23d1cd22353326ea81165fdf25983c6332eef34fc52cec7d116b1fc32310100000000b5f312e5ffffffff2a1b3fee6b29ea1828d427f0e5c3887cb7e644870000000020000000000000005864bae0684d55cb11a12b90d20d7e895681a7b09e41a21348f22a0fec5c5003d732310100000000928961e9ffffffffccb2909dcd316fc5e738dcdb1f14360f04b4432000000000200000000000000047e6a0a47a0e0d5192a12de2ff570cde4803ea56d92a625660b70f5559949fc47e2f310100000000a5a891e3ffffffff671d816776e8c7fae18dc122fb6dc231956c6d48000000002000000000000000c5a7c8e603d9105bbb89f1a92dfb12e956e42ef13a3cbb045c49d0c354d0027d612f3101000000007636fe2900000000188f984567f5c6426386127b6fba27cb59684dc200000000200000000000000069d38fcce468d11594da7b380ba73cfb74d834d0315e9dd1e9672fe5db773652592f310100000000487aa2040000000077be23139b650d69ede7985b31fd7b1cee9ca7d3000000002000000000000000ecba829b58afc1162afd916b741555d236a2b419b5b9bffb039b0fb283531798f82d310100000000a58ede2d000000001a4b644c16a4a1904618f8d3c0f6a6722303839000000000200000000000000089f54396f3f6cd2cd33fee29702320a549b669139a915f1b8c5b6ae8518a4593ea2d3101000000006839c72900000000c268fe001a533b6f0860167381384363a790fd0d00000000200000000000000023c4c17b424e7ae26cb0d6ce2c60b27abd22303973e888ff39c0319821294bf1b1bdbe00000000001f9e1cf7ffffffffa8a2bf2709ca05755f881ebd939991aea9f88cf1000000002000000000000000b2b729b9af71db32b6c5b1ed5dbd44fcbea52514e7ede8498209e570188210fc63758600000000009f8a1d21000000007ea986d8723587f5e653c0df785fcfce39238785000000002000000000000000001484953fca1ecc45179bb96f9852f0b8434b7d15b1279edd5d6e6404ba27cc3bb1850000000000c2c802ffffffffff616a45478336b92583cfe29e8ee942802de69eae0000000020000000000000005d5c25e4c750c38e32ab492f4d0d96d4e2ad1673b9fd9f6c9d393ed932343e14ba38810000000000fc118e00000000009407fa25941c932473f8e2b1ecc5481e3ae15a71000000002000000000000000b912dda2047d6026450945e0803a4aa8f26745dd539f9dbeb708809e4bc2df39e22c810000000000cfc0fbfcfffffffff42c7e49df4f4d0993237959518415e4737923920000000020000000000000001d2ecf9de5c7c78a773f0e3f4dfde4f1daaaab7cc0f39b609ad0f665adb395f018208100000000002d2b4afcffffffffaea26001de9b15d4dad32808712864e61ae52a1700000000200000000000000046d3d7b0a4adfbe4ffbf45eaaf4e2bada39701d41c6422e9cf9438ef8126b51caf0c8100000000008bc03f0000000000fbc2a3f682b507f1a3a5d4c44c8cbb6af08602960000000020000000000000002d6384b5cd3482006da1c8c968a6cd43602b649303e4869843f6bf6a045a70f197ed80000000000068630be3ffffffff2888677e39e38bf4ee64081bd43776fb4d507fcb000000002000000000000000061caf848751b3590ab6f2c82d0ae3041f2831c8920dd62c4f556bd8d7a25e7fd8db800000000000571cb8ebffffffff23df4a8418762cea4d24b7227ad125df76d2baf6000000002000000000000000d9efcd0e389b4f8045a327d3e66cb2ccc206a433c08878de2c23574a3ebf3b0d13d9800000000000e6366ce9ffffffffa9c7a884bd7d6e799ef5311bf9168e0105bce41600000000200000000000000015dceda598a86558fe610d1de4908765605e860485b96ae31bc0ca9918303511f9d1800000000000540866e3ffffffffb8f9204a348e0dbc85abe5bc98936d6b84c01e450000000020000000000000002f66263f9e4c3013dc6ee70eaa4599f0ee579b0b7f9d047d280067e5644d0bb2e7cd800000000000d87010e6ffffffff76f6dd3f07bf2e9ff5b0a188bc08d5a4efcf40d900000000200000000000000051c090dd4b573e3c85e64e3e28ca276969d0db6bed959aba0dfca09e6693a7d610c780000000000062dd302b000000009fee83fbf0bd5a4d71519efc16d0d438c203dd5a000000002000000000000000b0825c5296bc275ff8aa85da674b5b60d1248d25b6e40277d4bb2e8846128af52ac68000000000000e2fd4e2ffffffffb44fc7d70708095fbc30af164410749483f96439000000002000000000000000ea7995131ac44f490378f1856438db362ae42cec3448ab98807b2f9fec37d83603c3800000000000845983e1ffffffff2ab301f354a74f45afb347b2c00cdceb09cc719d000000002000000000000000a854a7beb6315a04473d6cf8db85d164e8829595e31e80d006fd423100d2effad8c2800000000000cf47a4e1ffffffffdc0802ad3262ecd784ce339d87073c836e31c69e000000002000000000000000de67753135e4d339b16cab0f3408b5c6952fb792c9bb8c948c60ed5da0fb74a99cc0800000000000a439bce0ffffffff60c51d643048d0a426171bd0deabd1689a89690f0000000020000000000000005250093effb687e0a1946e6e61d6a356cdc4abebe9e7fd58f37568464eed47bb2bc0800000000000b2648ce0ffffffff2972b0df619f73d1a5c8933aff22ad8c9258f37000000000200000000000000036103ddb3cbaef3af1f92cb503b8ba10c22f10b24807bb3019121ea1069fd17a29c08000000000006acca5e0ffffffff06be03f1b334fc3f7947d0d031f7dfa568005bd4000000002000000000000000467790623c59406b737d844edfc344c6256d82375a82ed5c8ab6f75d028b0f8777bf80000000000070c3312a000000009c4cc8543dc684948490681118957942b29a920000000000200000000000000099085ce62420e9a6a0a825378bc6e0345af98e4edbef7dec7baed443b5e2cc6361bf800000000000e5d52c2a00000000466d1236b8c77925b25219e4ffe34dd069351847000000002000000000000000f697bd6971d3a3801c910dde4769878b12ea64b8c0c37e0e9f340b66d8a44b8758bf800000000000a8a60d2b00000000646d5c6384c84c2e660bf268d0a4ebc1ffbceea60000000020000000000000007cdf9ff876227fbe52357253549ad018e475f7bf7bbabd34d47cff554b3742044dbf80000000000069c8082b0000000002d49d26c87ed7dc1e38d7bfe5b7fcdf5a3a3164000000002000000000000000b381533900081f35b3a65e06ff0b208f97188090d90267008a63ae77955c31c43dbf8000000000009256342b000000003ce85b466ff74142307b4b03ddacf17a52d4637300000000200000000000000038f6ee432fb1ebfbe2aab2fb3dcdb514b44daaebc051e7a0252a29de6f7212171bbf8000000000003de4302a00000000f1961eee75e5a1c8a11a5bf72fb368b990bdd28900000000200000000000000026b453d5a8f5d5ce66ae97ec87ffcf78a03e5c247ac25683800b01f9f7a0340bfebe8000000000000ae6fb2a000000005d673308ca2b45e5222303836d833e0f70b1f9b0000000002000000000000000f702393238df7999f3e68b59103f0a565a97444268bc0f03c58ac15888fb0044fdbe800000000000c10f2a2a00000000913834357f92e577cdc02b1e682c65e86d016ae5000000002000000000000000193d69ab72d9f31cfc80d75679df1dd80248580790faa8711c108e95ddb89345fdbe8000000000008d60282a00000000a8f38fcb39b580c4b856dcaed882d504a216ee0000000000200000000000000029d6bfb6948ca60cc7d089935d047be4d4d4ebacbd0f5e21542b9c4f6cbef4a0fdbe80000000000057be282a00000000c4ef42d72d69f4b58ffe2a58db1335269842ac430000000020000000000000003b0c9675aa48cc05af281072bcbbf66b9825eb20fa80aebb785cea7ff4ab9591fdbe8000000000005dae2c2a00000000d7076d16c2e91e0eb16753575ac3cee3057781c0000000002000000000000000a701f0f8ef57d7bf01f1399a93805e94e0b3d1545bd859061d9cd64ab4bfa33bfdbe800000000000ea7bfb2a0000000001b2c0f03ba9b2f352a39bc45ce37aa2710b5af40000000020000000000000009b6110875f9cf79dcc82e63623e3b4f9aadf515804a79ed2ed1eeff143ac2e53bd01390000000000289aae2600000000fbe1e3ed324fa17379403acfc3dd28fa882c6e6500000000200000000000000080f507fabe06cb3cf200b8b5f692f96221dd6d9c7054d14dabf69ea9030fa781ac690a000000000050506efcffffffff43965a09c5be34d027a599bd6f450f5e6a13ddf7000000002000000000000000ea0ea17ea3caaaeb394412799c37d2e59c4708d650125f4ab827fe85b140a0957d8902000000000048ad67e3ffffffffedd5716db0738cb0eecd0a04aeb186c4a46720e900000000200000000000000072b60871b477e866f772fda2ea3ea2b83a331d29a0e5d616fdeedd3add31460ca4c4010000000000a9522edafffffffff8260be47a1c7d42bbd9a656bdf8e3d3f28cbab2000000002000000000000000b4f7c002e2ccd4d414be2ea89f3d9ba621054349d2d06f871feb624d40fbe0640c41010000000000ca0d16f4ffffffffe6f8df77989972328c927e5493db6908936a4ea00000000020000000000000006197adf6d1fea4b71af280d08cf06a25dbc2a12a9f77e23b0009387304782de9a5eb0000000000004e9e690b0000000025764380a6df1c9cad29a842a049f690ab0f08bc000000002000000000000000b119be04c77200537989f31794a527ed5b699064ea09236403dff00d03f2f92f8f6800000000000054476be1ffffffff51b78fd2e37a2142b313f68a4edb31b23fe1afd100000000200000000000000046a6a52ea5dd0f7214a29e7c92ca575da79e26f861fe53b5ae84db2cf420c254905900000000000003125cdbffffffff8dabad1a71629e4938de8c44d0bd2f2ce1eabd080000000020000000000000004b24aadd2b8b16c8e686a4cec6d350c01b8777fc655818a990708afe7bc771351c3e00000000000041c5fad4ffffffff4e30f6a73766baa5fe6db7181b7fd08329c103e0000000002000000000000000a84f7bad047d6f18373e8410373ad6ee38e20df85446ddb5d8b8e1e0db6142c146330000000000008fd8800f0000000066439667823cf1cdefaf47d5ada806d462a6e05f00000000200000000000000075b96c2fd3bf61720acf96ef8d9a3aee11d4cee7e51d7793cd68bf66295c60527c2e00000000000041b4ffbbfffffffff70543a091a45a8c0de04e5ce9e40d9c16d980e1000000002000000000000000ae45dc59a343d10c19d36882a137a4f131f355b054d9c934a158b456e84af44f0221000000000000666eac1200000000b860c8e1ad41462d6352406b85260c9713418ffa000000002000000000000000a43051727b37efe109f58c37356e78cd4a6c8659b8cac549998a8630f0df8430150700000000000013b41d09000000006967de8bfc42a68d7c5eac521dd0099cea1fe230000000002000000000000000516be1ae9b9994b43b98613f3b0c24c3761d051aa27a0c9dc923fd60f3e617328b0500000000000035df0afdffffffff0d1df149a8579909fedf2111513c57897118b09e00000000200000000000000079d419d4cdd176f50d166cd016c3d7ff910ef6c9db51194bc9c8a6e54a584af501040000000000006c9e7eafffffffff02c375d9b259cdbb7b8a97d71b2a0a0dbed890e00000000020000000000000005bed2f1bc08c7a9b46d8973aae006b54901dd00a74b2534b28e987d950f30341e803000000000000a19ea3adffffffff5ade83d0ec62ab3eb6b023ff54c976eaf32e865500000000200000000000000047a58162ddcb35c8fd68f1f36f8b8fcd86ef8eb36013d86bd25912048b7c792460030000000000007bcdda0700000000bfffeb9cee54c0e110a1761f9a646e4589ee6fc0000000002000000000000000c073ae562642e4be9f84ead8cc50c0c7dc920b618e5bad629babbf98ffd4ae1df1010000000000006083f70100000000409d07de01ea2a63c779c0246562aa278a95611e000000002000000000000000e90018fbdc1b1cbeb1d89457ebbcbcf8eea2615683e3401a00bdeceb0d16c84ed9010000000000000b9cb10500000000a93fccc20939a8a0fecc48a9737402486bc41d53000000002000000000000000ef67a6569b62e1f189982471ebd2ed120a18e15707dbe0a9257085e2bd144f1dac01000000000000055c5c06000000009215b6b8ec64cb9e7b461c3945e6ce00da86f8f2000000002000000000000000427839a58cc1593a2e40ad449cb43155f7ed292a3c0e5398c9d22ea3c026f5909001000000000000e6b71b0700000000cea4cde95b67ff91fd25ea77c3075944764754b6000000002000000000000000d9d7fdfbee4ba7e247253aeb6faab2fd6e46b349ee7502c37f93588e43f2a4f9fe00000000000000557c66afffffffff60131b8768de4f8a40aaa34a9f0d40be902807ae000000002000000000000000abeb97145ce1a283bdcc667645304de4ed529348748eb1d6e3c61a5e7a19b89d8100000000000000323089f1ffffffff13247270303a9d66ea8ffa02614a8b5369adda53000000002000000000000000b84ea7d385787015dff693a22044faf6a0cab48af1a877495eacab1d6b7859717200000000000000850c090400000000349f27787689a635ffbe00e0dd66e848690a73f2000000002000000000000000c74711e51b16a97d2b16139604ac68f9c241f5393a53cbcf757d9b142fb4da4a3a000000000000001ac7900600000000e71b23c378e4c465bfe96ad48e7f93f237e939dc0000000020000000000000000004ed503ba91e4b03603d4cd037b919dbe815c50b403a25d175926683adde541f00000000000000501065b2ffffffffc2989ed51e73b742e4991cf915d6339419657ad5000000002000000000000000c0537de09cd816e67d622c910a84fbaf8ae77e855a3e228356631886c2a7efba1b00000000000000e0f383060000000080f78edcdb53aa69dea3f482472027327f1acf0e000000002000000000000000670a0d979a69fc78d59425442aba3548f2886fa68b4c783cab77a03405f3dbae0b00000000000000de189d040000000069a300bbe8cba17536cdb4346c148d1dd7475c6d0000000020000000000000006dafaf75f255ac071b403605b4fecde07eb28300943f29c7f04acc720561a30d0200000000000000529c7906000000001b21f9bf3b9a650607cced8c0c2fbeca3211791b0000000020000000000000006232324245cf914e074d45c3ef80c6c135e4d5aa64b9edf9474022b29b9f1f48010000000000000027327906000000002c4e108c3f09cf9b8b1515d3b26d50e332d86e3b0000000020000000000000005887c3659bf7d4e9c90d4bf9651efcfc72e8cde419112a0360a71b26c728c5d70100000000000000aec98fadffffffff300636fc6b27a7016f3aef03c231aa63163eeb5d00000000200000000000000082bb8244f020803ce4b9f1e1749f878da3b64e9ffe521b4bb35b89c124be7da901000000000000006a3279060000000037b7e284915654acc06e394fb423dcae6a4fd94f000000002000000000000000f189d1f576bf07d58fdb4d4b138b434ed30a627cd6e4e4e947362ff4fb6f12090100000000000000912979060000000065c584027f5fd8349027fa5bf1d4ed3828c29058000000002000000000000000731048e047fb31f01277508ec27d9eaa0568a0fd10a76783425b3fa6fedd31af0100000000000000d50d79060000000064cdacb04fb9c3b290579644f9edbd05cb00bb7d000000002000000000000000c9d641627d6eced574dfdcb08e243cad1c9c9d71dceb684ad74fb865a95a4156b300fb02000000003cb83d2c00000000f33bd74a0000000001010000000000000088e100000000000060000000000000003c70d8336dee739bdf2d1c5a0fca0a88b87b9a6d000000002000000000000000860e2c9b980d61bf53e1d582f789c35bedf4a252c4093e9392ba7516d9d505110b16190300000000285044100000000033ecd5899a91105bb4e51066eb138189bc3825ad00000000200000000000000075617111844fcc8c90a4fc121f2c37d19643667e868192690f2314bf14526ed4d60e0803000000004c5b9c2b00000000f2e6bb25d8d269c9737bd3789b11dc76c4fc56e70000000020000000000000000106edcb594c1e457564711c5bc0ba0182bc42131fc5a02105da76c3e624a76f74b1ff0200000000876ec71400000000c27b627c2fd11ee1e3e850738720692be2e3f4c6000000002000000000000000bee1e39ec395c97158a2dd51695f96c7e724da138ebdbf7f417c17bb3796726edc48ff020000000047a3a30900000000bb386aa0e7b37eb33516aebb58cae3574af85d1f0000000020000000000000007033e708beda4a88c330b82edb7286df02156fa71fa53152dc306298386d42ba6007fc0200000000bb10e418000000002a3d40c3e7ce8d6b55077335cab141c2e11ac254000000002000000000000000914426099b4fe08deae4590a68f553bd79ebdd4303ec6c2586719d917aac6db8557afb02000000004930e8edffffffff44c395a4a96c6d1a450ed33b5a8ddb359cefed36000000002000000000000000aba9508fec18359f9042ef73816a167d25dcc2740d1336f66bb1e7c96c8141fd5e68fb02000000003f01a00c0000000043804074334ac6111233037efe20105c516b0e9f000000002000000000000000e07a4ba0104afc6cdd71e063a03e195c109e332bf5e163c37a80ad67506a62fdc21bfb0200000000f25c890b00000000ec033669fe506006f870bd8b12cb524a3abc3693000000002000000000000000003c8c0c3b27c3ddcd7414aa5d195175e58c36789c8ad9b58a4275e09db8d099e40afb0200000000f8c99a300000000064cdacb04fb9c3b290579644f9edbd05cb00bb7d000000002000000000000000c9d641627d6eced574dfdcb08e243cad1c9c9d71dceb684ad74fb865a95a4156b300fb0200000000a6306c0f000000005295664886565f43a3074140551a755872bf6ffd0000000020000000000000006f7cb6f22bb847e20199220fc0903dd24eb2a9be6424f82f0d50a6727a5225c947fbfa02000000006185031800000000da37d2935eae0a92de55e86db2e887b4f18575f0000000002000000000000000c7b8b7b6b6cc2457c271bf5201f65b2fcb363350f4387438a6218ff839a4274909f3fa0200000000bff37c0400000000718160e3538e0b0ed83d3b3dc4ece83809fcd107000000002000000000000000bb1aed9ed9b0557ba3794a48f15243f4c8c6b9b176c69b589c71664f896496f9dff63401000000003ec7ed2300000000b03f0cb997f3428ef3968833bca2f2a4f613a8eb00000000200000000000000069f12605bf4bd86e48fda138649db87461446490efadd047f77a1ff23606bf6d3fe8320100000000f358a820000000005c78a0762f13b0b2a793e82d1a178eb45642234d000000002000000000000000b45c85f1255127cd73f4edaadb0cd9307522b76be00d68849efd9a2bf0920a82c2c83101000000007da7a51600000000410c1ebaf54c090f0a9132dfa9f79e0f480b2c060000000020000000000000006fbfe2d80362615ec2b5ad355b08c122e3799894f5a8c81c13af60909e1b057fccb73101000000006d2b58f8ffffffff6cc0a1531ff58d61dc9061c5b89bc0efc07911fc0000000020000000000000007eef62daf827c634f1036c88485a507519b226c7cbb79cf203e67b3628c32b7ebbb4310100000000076126f9ffffffff53406de83381dd804632447f1baed00cf28048e000000000200000000000000051f5b4a16dc3ba302181af9de097f591a9546b9754b2b1cb86d2d980df4ceac0cba431010000000044f5bbfbffffffff70dac78498afc6d766d860c433265a274d48b7d800000000200000000000000054393aab853ae377ef15a80742358da0a52a9ebea553734a068f444404b990346f9e3101000000003e558fe8ffffffffb41ef50272a7a2398ba617d3c963986ebebc5b2d0000000020000000000000001a9acf9916b1e429c5bc5b12f5fea61acb5fef345712f25d12806ebc4369fdc28396310100000000874bc4e7ffffffff3965c223e13ac66f8175c86e657d396c711964b7000000002000000000000000238dd24b92eb981a83414440555ca2b18c57dcb8be9982bb3fb4a28fafb26081ff93310100000000093807f0ffffffff521d2a344e322b8ba76401c833a1ec74ea2bd07500000000200000000000000007375d930bcce7b8cd22c03b4f15324bcc0b2d24db0e96bc201aa21b2f8b6b11454a310100000000c878ccf1ffffffffe2fc4df9e7870fc8238136faca07a120cc078a0c000000002000000000000000d5348d0cfd3cd3172271c08714ead78550755c10cf495c0c2bce65abf1f4742f513c31010000000092998b180000000035f6c0359084c37ef6eb4061b694386910093b9900000000200000000000000001ab6e5d364ec005a1b9f0c98915e4ac371ef63795bdb7193a1b2ec3a7be80d3e33631010000000015f38e12000000001b03ab3c744545b281d224127708a9ec7487e58c00000000200000000000000062180dafc3a23d1cd22353326ea81165fdf25983c6332eef34fc52cec7d116b1fc32310100000000ef7d6b15000000002a1b3fee6b29ea1828d427f0e5c3887cb7e644870000000020000000000000005864bae0684d55cb11a12b90d20d7e895681a7b09e41a21348f22a0fec5c5003d7323101000000001520ba1900000000ccb2909dcd316fc5e738dcdb1f14360f04b4432000000000200000000000000047e6a0a47a0e0d5192a12de2ff570cde4803ea56d92a625660b70f5559949fc47e2f310100000000b55beb1300000000671d816776e8c7fae18dc122fb6dc231956c6d48000000002000000000000000c5a7c8e603d9105bbb89f1a92dfb12e956e42ef13a3cbb045c49d0c354d0027d612f31010000000034b7800f00000000188f984567f5c6426386127b6fba27cb59684dc200000000200000000000000069d38fcce468d11594da7b380ba73cfb74d834d0315e9dd1e9672fe5db773652592f310100000000aefd24eaffffffff77be23139b650d69ede7985b31fd7b1cee9ca7d3000000002000000000000000ecba829b58afc1162afd916b741555d236a2b419b5b9bffb039b0fb283531798f82d31010000000040876113000000001a4b644c16a4a1904618f8d3c0f6a6722303839000000000200000000000000089f54396f3f6cd2cd33fee29702320a549b669139a915f1b8c5b6ae8518a4593ea2d310100000000a9364a0f00000000c268fe001a533b6f0860167381384363a790fd0d00000000200000000000000023c4c17b424e7ae26cb0d6ce2c60b27abd22303973e888ff39c0319821294bf1b1bdbe00000000004dde9e0200000000a8a2bf2709ca05755f881ebd939991aea9f88cf1000000002000000000000000b2b729b9af71db32b6c5b1ed5dbd44fcbea52514e7ede8498209e570188210fc6375860000000000c09078f4ffffffff7ea986d8723587f5e653c0df785fcfce39238785000000002000000000000000001484953fca1ecc45179bb96f9852f0b8434b7d15b1279edd5d6e6404ba27cc3bb18500000000001e2c761d00000000616a45478336b92583cfe29e8ee942802de69eae0000000020000000000000005d5c25e4c750c38e32ab492f4d0d96d4e2ad1673b9fd9f6c9d393ed932343e14ba388100000000002d787d20000000009407fa25941c932473f8e2b1ecc5481e3ae15a71000000002000000000000000b912dda2047d6026450945e0803a4aa8f26745dd539f9dbeb708809e4bc2df39e22c810000000000b815ef1c00000000f42c7e49df4f4d0993237959518415e4737923920000000020000000000000001d2ecf9de5c7c78a773f0e3f4dfde4f1daaaab7cc0f39b609ad0f665adb395f0182081000000000028bf411c00000000aea26001de9b15d4dad32808712864e61ae52a1700000000200000000000000046d3d7b0a4adfbe4ffbf45eaaf4e2bada39701d41c6422e9cf9438ef8126b51caf0c81000000000063c63d2000000000fbc2a3f682b507f1a3a5d4c44c8cbb6af08602960000000020000000000000002d6384b5cd3482006da1c8c968a6cd43602b649303e4869843f6bf6a045a70f197ed80000000000038bc1303000000002888677e39e38bf4ee64081bd43776fb4d507fcb000000002000000000000000061caf848751b3590ab6f2c82d0ae3041f2831c8920dd62c4f556bd8d7a25e7fd8db8000000000009259c60b0000000023df4a8418762cea4d24b7227ad125df76d2baf6000000002000000000000000d9efcd0e389b4f8045a327d3e66cb2ccc206a433c08878de2c23574a3ebf3b0d13d98000000000008a5f7b0900000000a9c7a884bd7d6e799ef5311bf9168e0105bce41600000000200000000000000015dceda598a86558fe610d1de4908765605e860485b96ae31bc0ca9918303511f9d18000000000009a8c770300000000b8f9204a348e0dbc85abe5bc98936d6b84c01e450000000020000000000000002f66263f9e4c3013dc6ee70eaa4599f0ee579b0b7f9d047d280067e5644d0bb2e7cd800000000000184f23060000000076f6dd3f07bf2e9ff5b0a188bc08d5a4efcf40d900000000200000000000000051c090dd4b573e3c85e64e3e28ca276969d0db6bed959aba0dfca09e6693a7d610c780000000000012c56e00000000009fee83fbf0bd5a4d71519efc16d0d438c203dd5a000000002000000000000000b0825c5296bc275ff8aa85da674b5b60d1248d25b6e40277d4bb2e8846128af52ac68000000000000f9fe90200000000b44fc7d70708095fbc30af164410749483f96439000000002000000000000000ea7995131ac44f490378f1856438db362ae42cec3448ab98807b2f9fec37d83603c380000000000078d59901000000002ab301f354a74f45afb347b2c00cdceb09cc719d000000002000000000000000a854a7beb6315a04473d6cf8db85d164e8829595e31e80d006fd423100d2effad8c28000000000000ad2ba0100000000dc0802ad3262ecd784ce339d87073c836e31c69e000000002000000000000000de67753135e4d339b16cab0f3408b5c6952fb792c9bb8c948c60ed5da0fb74a99cc0800000000000cb81d3000000000060c51d643048d0a426171bd0deabd1689a89690f0000000020000000000000005250093effb687e0a1946e6e61d6a356cdc4abebe9e7fd58f37568464eed47bb2bc08000000000005ed2a300000000002972b0df619f73d1a5c8933aff22ad8c9258f37000000000200000000000000036103ddb3cbaef3af1f92cb503b8ba10c22f10b24807bb3019121ea1069fd17a29c0800000000000c03abd000000000006be03f1b334fc3f7947d0d031f7dfa568005bd4000000002000000000000000467790623c59406b737d844edfc344c6256d82375a82ed5c8ab6f75d028b0f8777bf800000000000ed3072ffffffffff9c4cc8543dc684948490681118957942b29a920000000000200000000000000099085ce62420e9a6a0a825378bc6e0345af98e4edbef7dec7baed443b5e2cc6361bf800000000000b04a6dffffffffff466d1236b8c77925b25219e4ffe34dd069351847000000002000000000000000f697bd6971d3a3801c910dde4769878b12ea64b8c0c37e0e9f340b66d8a44b8758bf800000000000701e4e0000000000646d5c6384c84c2e660bf268d0a4ebc1ffbceea60000000020000000000000007cdf9ff876227fbe52357253549ad018e475f7bf7bbabd34d47cff554b3742044dbf800000000000d84349000000000002d49d26c87ed7dc1e38d7bfe5b7fcdf5a3a3164000000002000000000000000b381533900081f35b3a65e06ff0b208f97188090d90267008a63ae77955c31c43dbf80000000000051d77400000000003ce85b466ff74142307b4b03ddacf17a52d4637300000000200000000000000038f6ee432fb1ebfbe2aab2fb3dcdb514b44daaebc051e7a0252a29de6f7212171bbf800000000000467071fffffffffff1961eee75e5a1c8a11a5bf72fb368b990bdd28900000000200000000000000026b453d5a8f5d5ce66ae97ec87ffcf78a03e5c247ac25683800b01f9f7a0340bfebe800000000000b47b3c00000000005d673308ca2b45e5222303836d833e0f70b1f9b0000000002000000000000000f702393238df7999f3e68b59103f0a565a97444268bc0f03c58ac15888fb0044fdbe800000000000c0a56affffffffff913834357f92e577cdc02b1e682c65e86d016ae5000000002000000000000000193d69ab72d9f31cfc80d75679df1dd80248580790faa8711c108e95ddb89345fdbe8000000000008cf668ffffffffffa8f38fcb39b580c4b856dcaed882d504a216ee0000000000200000000000000029d6bfb6948ca60cc7d089935d047be4d4d4ebacbd0f5e21542b9c4f6cbef4a0fdbe800000000000565469ffffffffffc4ef42d72d69f4b58ffe2a58db1335269842ac430000000020000000000000003b0c9675aa48cc05af281072bcbbf66b9825eb20fa80aebb785cea7ff4ab9591fdbe8000000000005c446dffffffffffd7076d16c2e91e0eb16753575ac3cee3057781c0000000002000000000000000a701f0f8ef57d7bf01f1399a93805e94e0b3d1545bd859061d9cd64ab4bfa33bfdbe800000000000e9113c000000000001b2c0f03ba9b2f352a39bc45ce37aa2710b5af40000000020000000000000009b6110875f9cf79dcc82e63623e3b4f9aadf515804a79ed2ed1eeff143ac2e53bd013900000000006706c11300000000fbe1e3ed324fa17379403acfc3dd28fa882c6e6500000000200000000000000080f507fabe06cb3cf200b8b5f692f96221dd6d9c7054d14dabf69ea9030fa781ac690a0000000000343af9f8ffffffff43965a09c5be34d027a599bd6f450f5e6a13ddf7000000002000000000000000ea0ea17ea3caaaeb394412799c37d2e59c4708d650125f4ab827fe85b140a0957d89020000000000c70690e2ffffffffedd5716db0738cb0eecd0a04aeb186c4a46720e900000000200000000000000072b60871b477e866f772fda2ea3ea2b83a331d29a0e5d616fdeedd3add31460ca4c4010000000000350898d9fffffffff8260be47a1c7d42bbd9a656bdf8e3d3f28cbab2000000002000000000000000b4f7c002e2ccd4d414be2ea89f3d9ba621054349d2d06f871feb624d40fbe0640c41010000000000ce74abf3ffffffffe6f8df77989972328c927e5493db6908936a4ea00000000020000000000000006197adf6d1fea4b71af280d08cf06a25dbc2a12a9f77e23b0009387304782de9a5eb00000000000085601b0b0000000025764380a6df1c9cad29a842a049f690ab0f08bc000000002000000000000000b119be04c77200537989f31794a527ed5b699064ea09236403dff00d03f2f92f8f68000000000000d98f48e1ffffffff51b78fd2e37a2142b313f68a4edb31b23fe1afd100000000200000000000000046a6a52ea5dd0f7214a29e7c92ca575da79e26f861fe53b5ae84db2cf420c254905900000000000033553edbffffffff8dabad1a71629e4938de8c44d0bd2f2ce1eabd080000000020000000000000004b24aadd2b8b16c8e686a4cec6d350c01b8777fc655818a990708afe7bc771351c3e000000000000f525e6d4ffffffff4e30f6a73766baa5fe6db7181b7fd08329c103e0000000002000000000000000a84f7bad047d6f18373e8410373ad6ee38e20df85446ddb5d8b8e1e0db6142c1463300000000000051d26f0f0000000066439667823cf1cdefaf47d5ada806d462a6e05f00000000200000000000000075b96c2fd3bf61720acf96ef8d9a3aee11d4cee7e51d7793cd68bf66295c60527c2e0000000000001545f0bbfffffffff70543a091a45a8c0de04e5ce9e40d9c16d980e1000000002000000000000000ae45dc59a343d10c19d36882a137a4f131f355b054d9c934a158b456e84af44f0221000000000000bc78a11200000000b860c8e1ad41462d6352406b85260c9713418ffa000000002000000000000000a43051727b37efe109f58c37356e78cd4a6c8659b8cac549998a8630f0df843015070000000000001a5a1b09000000006967de8bfc42a68d7c5eac521dd0099cea1fe230000000002000000000000000516be1ae9b9994b43b98613f3b0c24c3761d051aa27a0c9dc923fd60f3e617328b050000000000000e0809fdffffffff0d1df149a8579909fedf2111513c57897118b09e00000000200000000000000079d419d4cdd176f50d166cd016c3d7ff910ef6c9db51194bc9c8a6e54a584af50104000000000000174a7dafffffffff02c375d9b259cdbb7b8a97d71b2a0a0dbed890e00000000020000000000000005bed2f1bc08c7a9b46d8973aae006b54901dd00a74b2534b28e987d950f30341e8030000000000009952a2adffffffff5ade83d0ec62ab3eb6b023ff54c976eaf32e865500000000200000000000000047a58162ddcb35c8fd68f1f36f8b8fcd86ef8eb36013d86bd25912048b7c792460030000000000009baed90700000000bfffeb9cee54c0e110a1761f9a646e4589ee6fc0000000002000000000000000c073ae562642e4be9f84ead8cc50c0c7dc920b618e5bad629babbf98ffd4ae1df1010000000000005bdef60100000000409d07de01ea2a63c779c0246562aa278a95611e000000002000000000000000e90018fbdc1b1cbeb1d89457ebbcbcf8eea2615683e3401a00bdeceb0d16c84ed901000000000000fefeb00500000000a93fccc20939a8a0fecc48a9737402486bc41d53000000002000000000000000ef67a6569b62e1f189982471ebd2ed120a18e15707dbe0a9257085e2bd144f1dac01000000000000e9cd5b06000000009215b6b8ec64cb9e7b461c3945e6ce00da86f8f2000000002000000000000000427839a58cc1593a2e40ad449cb43155f7ed292a3c0e5398c9d22ea3c026f590900100000000000016331b0700000000cea4cde95b67ff91fd25ea77c3075944764754b6000000002000000000000000d9d7fdfbee4ba7e247253aeb6faab2fd6e46b349ee7502c37f93588e43f2a4f9fe00000000000000ff2766afffffffff60131b8768de4f8a40aaa34a9f0d40be902807ae000000002000000000000000abeb97145ce1a283bdcc667645304de4ed529348748eb1d6e3c61a5e7a19b89d81000000000000005d0589f1ffffffff13247270303a9d66ea8ffa02614a8b5369adda53000000002000000000000000b84ea7d385787015dff693a22044faf6a0cab48af1a877495eacab1d6b7859717200000000000000abe6080400000000349f27787689a635ffbe00e0dd66e848690a73f2000000002000000000000000c74711e51b16a97d2b16139604ac68f9c241f5393a53cbcf757d9b142fb4da4a3a00000000000000d8b3900600000000e71b23c378e4c465bfe96ad48e7f93f237e939dc0000000020000000000000000004ed503ba91e4b03603d4cd037b919dbe815c50b403a25d175926683adde541f00000000000000050665b2ffffffffc2989ed51e73b742e4991cf915d6339419657ad5000000002000000000000000c0537de09cd816e67d622c910a84fbaf8ae77e855a3e228356631886c2a7efba1b00000000000000e9ea83060000000080f78edcdb53aa69dea3f482472027327f1acf0e000000002000000000000000670a0d979a69fc78d59425442aba3548f2886fa68b4c783cab77a03405f3dbae0b0000000000000037159d040000000069a300bbe8cba17536cdb4346c148d1dd7475c6d0000000020000000000000006dafaf75f255ac071b403605b4fecde07eb28300943f29c7f04acc720561a30d0200000000000000a89b7906000000001b21f9bf3b9a650607cced8c0c2fbeca3211791b0000000020000000000000006232324245cf914e074d45c3ef80c6c135e4d5aa64b9edf9474022b29b9f1f480100000000000000d2317906000000002c4e108c3f09cf9b8b1515d3b26d50e332d86e3b0000000020000000000000005887c3659bf7d4e9c90d4bf9651efcfc72e8cde419112a0360a71b26c728c5d7010000000000000059c98fadffffffff300636fc6b27a7016f3aef03c231aa63163eeb5d00000000200000000000000082bb8244f020803ce4b9f1e1749f878da3b64e9ffe521b4bb35b89c124be7da90100000000000000153279060000000037b7e284915654acc06e394fb423dcae6a4fd94f000000002000000000000000f189d1f576bf07d58fdb4d4b138b434ed30a627cd6e4e4e947362ff4fb6f120901000000000000003c2979060000000065c584027f5fd8349027fa5bf1d4ed3828c29058000000002000000000000000731048e047fb31f01277508ec27d9eaa0568a0fd10a76783425b3fa6fedd31af0100000000000000800d790600000000b41ef50272a7a2398ba617d3c963986ebebc5b2d0000000020000000000000001a9acf9916b1e429c5bc5b12f5fea61acb5fef345712f25d12806ebc4369fdc28396310100000000874bc4e7fffffffff33bd74a00000000"
        );

        let header = Header::decode_as::<Bincode>(&bz).unwrap();

        dbg!(header);
    }
}
